//
// Created by LiuYou on 2021/8/17.
//

#ifndef HIGHPERFORMANCELINUXSERVERPROGRAMMING_LINUX2_TIMERLINKEDLIST_HPP
#define HIGHPERFORMANCELINUXSERVERPROGRAMMING_LINUX2_TIMERLINKEDLIST_HPP


#include <ctime>
#include <netinet/in.h>


class UtilityTimer;

/**
 * @brief 用户数据结构。
 */
class ClientData {
public:
    ClientData(const sockaddr_in& clientAddress, int socketFd, char* buf, UtilityTimer* utilityTimer);

    ClientData();

    ~ClientData();

public:
    // 客户端socket地址
    sockaddr_in clientAddress;
    // socket文件描述符
    int socketFd;

    static const int BUF_SIZE = 64;
    // 读缓存
    char buf[BUF_SIZE];
    // 定时器
    UtilityTimer* utilityTimer;
};


/**
 * @brief 定时器类。
 */
class UtilityTimer {
public:
    UtilityTimer(time_t expire, void (* cbFunc)(ClientData*), ClientData* clientData, UtilityTimer* prev,
                 UtilityTimer* next);

    UtilityTimer();

    ~UtilityTimer();

public:
    // 任务的超时时间, 这里使用绝对时间。
    time_t expire;

    // cb_func是字段, 是类的成员变量。这个成员变量是 void (*)(ClientData*) 类型的指针。
    // 对比 int* 类型的指针。这是指向函数的指针, 即函数指针。而int* 类型的指针是指向int类型变量的指针。
    //
    // 任务回调函数。
    void (* cb_func)(ClientData*);

    // 回调函数处理的客户数据, 由定时器的执行者传递给回调函数。
    ClientData* clientData;
    UtilityTimer* prev;
    UtilityTimer* next;
};


/**
 * @brief 定时器链表, 它是一个升序、双向链表, 且带有头结点和尾结点。
 */
class TimerLinkedList {
public:
    void addTimer(UtilityTimer* timer);

    void adjustTimer(UtilityTimer* timer);

    void deleteTimer(UtilityTimer* timer);

    void tick();

public:
    TimerLinkedList(UtilityTimer* head, UtilityTimer* tail);

    TimerLinkedList();

    ~TimerLinkedList();

private:
    void addTimer(UtilityTimer* timer, UtilityTimer* headNode);

private:
    UtilityTimer* head;
    UtilityTimer* tail;
};


#endif //HIGHPERFORMANCELINUXSERVERPROGRAMMING_LINUX2_TIMERLINKEDLIST_HPP
